﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Comukrte;

namespace Comukrte.Controllers
{ 
    public class CursosController : Controller
    {
        private comukrteEntities db = new comukrteEntities();

        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult AgregarParticipante(int id)
        {           

            tblCursos cursos = db.tblCursos.Single(t => t.CursoId == id);
            IEnumerable<tblPersonal> omitir = cursos.tblPersonal.Select(m => m);
            IEnumerable<tblPersonal> Personal = db.tblPersonal;
            
           List<tblCursosPersonalAgregar> Personas = new List<tblCursosPersonalAgregar>();

            foreach (tblPersonal item in Personal.Except(omitir))
            {
                tblCursosPersonalAgregar cpa = new tblCursosPersonalAgregar()
                {
                    CursoId = id,
                    Personal = item,
                    Agregar = false
                };
                Personas.Add(cpa);
            }
            return View(Personas.ToList());
        }

        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [AcceptVerbs("POST")]
        public object AgregarPart(List<tblCursosPersonalAgregar> product, FormCollection form, int? CursoId)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    bool HuboCambios = false;
                    var Seleccionados = from x in form.AllKeys
                                        where form[x] != "false"
                                        select x;


                    foreach (var selecionado in Seleccionados)
                    {
                        tblCursos Curso = db.tblCursos.First(e => e.CursoId == CursoId);
                        int selecionadoid;
                        bool res = int.TryParse(selecionado, out selecionadoid);
                        if (res == true)
                        {
                            tblPersonal Personal = db.tblPersonal.First(j => j.PersonaId == selecionadoid);
                            Curso.tblPersonal.Add(Personal);
                            HuboCambios = true;
                            db.SaveChanges();
                        }

                    }

                    if (HuboCambios)
                    {
                        db.SaveChanges();
                    }

                    return RedirectToAction("Participantes", new { id = CursoId });
                }
                catch (Exception)
                {                   
                    return RedirectToAction("AgregarParticipante", new { id = CursoId });
                }
            }
            return View(product); 
        }

        //
        // GET: /Cursos/Participantes/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ViewResult Participantes(int id)
        {
           
            tblCursos tblCursos = db.tblCursos.Single(m => m.CursoId == id);
            var Cursos = db.tblCursos.Include("tblPersonal").Where(m => m.CursoId == id);

            return View(Cursos.ToList());
           
           
        }

        //
        // GET: /Cursos/
        [Authorize(Roles="Administrador,Recursos Humanos")]
        public ViewResult Index()
        {
            var tblcursos = db.tblCursos.Include(t => t.tblInstructoresCurso).Include(t => t.tblMetodosCurso);
            return View(tblcursos.ToList());
        }

        //
        // GET: /Cursos/Details/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ViewResult Details(int id)
        {
            tblCursos tblcursos = db.tblCursos.Find(id);
            return View(tblcursos);
        }

        //
        // GET: /Cursos/Create
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult Create()
        {
            ViewBag.InstructorCursoId = new SelectList(db.tblInstructoresCurso, "InstructorCursoId", "Nombre");
            ViewBag.MetodoCursoId = new SelectList(db.tblMetodosCurso, "MetodoCursoId", "Descripcion");
            return View();
        } 

        //
        // POST: /Cursos/Create
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost]
        public ActionResult Create(tblCursos tblcursos)
        {
            if (ModelState.IsValid)
            {
                db.tblCursos.Add(tblcursos);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.InstructorCursoId = new SelectList(db.tblInstructoresCurso, "InstructorCursoId", "Nombre", tblcursos.InstructorCursoId);
            ViewBag.MetodoCursoId = new SelectList(db.tblMetodosCurso, "MetodoCursoId", "Descripcion", tblcursos.MetodoCursoId);
            return View(tblcursos);
        }
        
        //
        // GET: /Cursos/Edit/5
 [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult Edit(int id)
        {
            tblCursos tblcursos = db.tblCursos.Find(id);
            ViewBag.InstructorCursoId = new SelectList(db.tblInstructoresCurso, "InstructorCursoId", "Nombre", tblcursos.InstructorCursoId);
            ViewBag.MetodoCursoId = new SelectList(db.tblMetodosCurso, "MetodoCursoId", "Descripcion", tblcursos.MetodoCursoId);
            return View(tblcursos);
        }

        //
        // POST: /Cursos/Edit/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost]
        public ActionResult Edit(tblCursos tblcursos)
        {
            if (ModelState.IsValid)
            {
                db.Entry(tblcursos).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.InstructorCursoId = new SelectList(db.tblInstructoresCurso, "InstructorCursoId", "Nombre", tblcursos.InstructorCursoId);
            ViewBag.MetodoCursoId = new SelectList(db.tblMetodosCurso, "MetodoCursoId", "Descripcion", tblcursos.MetodoCursoId);
            return View(tblcursos);
        }

        //
        // GET: /Cursos/Delete/5
 [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult Delete(int id)
        {
            tblCursos tblcursos = db.tblCursos.Find(id);
            return View(tblcursos);
        }

        //
        // POST: /Cursos/Delete/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            tblCursos tblcursos = db.tblCursos.Find(id);
            db.tblCursos.Remove(tblcursos);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ViewResult VerConocimientos(int id)
        {
            tblCursosConocimientos rh = new tblCursosConocimientos()
            {
                CursoId = id

            };
            IEnumerable<tblCursos> Cursos = db.tblCursos.Where(t => t.CursoId == id);
            return View(Cursos.ToList());
        }

        //
        // GET: /AgregarConocimiento/
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ViewResult AgregarConocimiento(int id)
        {
            tblCursosConocimientos rh = new tblCursosConocimientos()
            {
                CursoId = id

            };
            tblCursos Curso = db.tblCursos.Single(t => t.CursoId == id);
            IEnumerable<tblConocimientos> omitir = Curso.tblConocimientos.Select(m => m);
            IEnumerable<tblConocimientos> Conocimientos = db.tblConocimientos;
            ViewBag.Title = "Agregar Conocimiento";

            ViewBag.ddlConocimientos = new SelectList(Conocimientos.Except(omitir), "ConocimientoId", "Nombre");
            return View(rh);

        }

        //
        // POST: /Roles/AgregarConocimiento/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost]
        public ActionResult AgregarConocimiento(tblCursosConocimientos tblPuestosc, int? ConocimientoId)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    tblCursos Curso = db.tblCursos.First(e => e.CursoId == tblPuestosc.CursoId);
                    tblConocimientos Conocimiento = db.tblConocimientos.First(j => j.ConocimientoId == ConocimientoId);
                    Curso.tblConocimientos.Add(Conocimiento);
                    db.tblCursos.Attach(Curso);

                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                catch (Exception)
                {
                    ModelState.AddModelError("", "");
                }

            }
            else
            {
                tblCursos cursos = db.tblCursos.Single(t => t.CursoId == tblPuestosc.CursoId);
                IEnumerable<tblConocimientos> omitir = cursos.tblConocimientos.Select(m => m);
                IEnumerable<tblConocimientos> Conocimientos = db.tblConocimientos;
                ViewBag.ddlConocimientos = new SelectList(Conocimientos.Except(omitir), "ConocimientoId", "Descripcion");

                ModelState.AddModelError("", "Hubo un problema, al agregar un conocimiento.");

            }
            return View(tblPuestosc);
        }

        //
        // GET: /Cursos/EliminarConocimiento/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult EliminarConocimiento(int id, int ConocimientoId)
        {
            tblCursos Curso = db.tblCursos.Single(t => t.CursoId == id);
            Curso.tblConocimientos.First(h => h.ConocimientoId == ConocimientoId);
            return View(Curso);

        }

        //
        // POST: /Cursos/EliminarConocimiento/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost, ActionName("EliminarConocimiento")]
        public ActionResult EliminarConocimientoConfirmado(int id, int ConocimientoId)
        {
            tblCursos Curso = db.tblCursos.Single(t => t.CursoId == id);
            tblConocimientos Conocimiento = Curso.tblConocimientos.First(h => h.ConocimientoId == ConocimientoId);
            Curso.tblConocimientos.Remove(Conocimiento);

            db.SaveChanges();
            return RedirectToAction("Index");
        }

        //
        // GET: /Cursos/Delete/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        public ActionResult EliminarParticipante(int id, int PersonaId)
        {
            tblCursos tblcursos = db.tblCursos.Single(t => t.CursoId == id);
            var pe = db.tblPersonal.First(h => h.PersonaId == PersonaId);

            tblCursosPersonalEliminar Participante = new tblCursosPersonalEliminar()
            {
                CursoId = id,
                Participante = pe
            };
            return View(Participante);
        }

        //
        // POST: /Cursos/EliminarParticipante/5
        [Authorize(Roles = "Administrador,Recursos Humanos")]
        [HttpPost, ActionName("EliminarParticipante")]
        public ActionResult EliminarParticipanteConfirmar(int id, int PersonaId)
        {
            tblCursos tblcursos = db.tblCursos.Single(t => t.CursoId == id);
            tblPersonal tblpersonal = tblcursos.tblPersonal.First(h => h.PersonaId == PersonaId);
            tblcursos.tblPersonal.Remove(tblpersonal);
           
            db.SaveChanges();
            return RedirectToAction("Participantes", new { id = id });
        }
    }
}